/*
 * Copyright (C) 2014 Tolstykh Vladislav
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 */

package lib.scripture;

import java.util.TreeMap;
import lib.io.xml.Reader;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

/**
 * Модель книги.
 * @author Толстых Владислав
 */
public class HashableBook {
    private final int ID;
    private final String LANG;
    private final Title TITLE;
    private final Content CONTENT;
    
    /**
     * 
     * @param id
     * @param lang 
     */
    public HashableBook(int id, String lang) {
        ID=id; 
        LANG=lang;
        TITLE=setTitle();
        CONTENT=setContent();
    }
    
    /**
     * Порядковый номер книги.
     * @return число большее на еденицу, чем индекс в массиве
     */
    int id(){
        return ID+1;
    };
    
    /**
     * Получить название книги
     * @return паблик-объект "Название книги"
     */
    public Title getTitle(){
        return TITLE;
    }
    
    /**
     * Загрузка названия книги из xml
     * @return приват-объект "Название книги"
     */
    private Title setTitle(){        
        Title title = null;
        NodeList push = new Reader().push(ID, "scripture");
        String nodeName = push.item(0).getNodeName();
        if(nodeName.equals("scripture")){
            if (push.item(0).getNodeType() == Node.ELEMENT_NODE) {
                Element bookRoot = (Element) push.item(0);
                String translation = bookRoot.getAttribute(LANG);
                title = new Title(id(),LANG,translation);
            }            
        }
        return title;
    }
    
    /**
     * Содержание книги.
     * @return паблик-объект "Содержание"
     */
    public Content getContent(){
        return CONTENT;
    }     
    
    /**
     * Загрузка cодержания книги из xml.
     * @return приват-объект "Содержание"
     */   
    private Content setContent(){     
        
        Content content = new Content();
        
        NodeList push = new Reader().push(ID, "chapter");
        String nodeName = push.item(0).getNodeName();
        int nodeSize = push.getLength();
        if(nodeName.equals("chapter")){
            for (int i = 0; i < nodeSize; i++) {
                if (push.item(i).getNodeType() == Node.ELEMENT_NODE){
                    Element chaptRoot = (Element) push.item(i);
                    String chapterId = chaptRoot.getAttribute("id");
                    
                    //Создаём экземпляр главы
                    Chapter сhapter = new Chapter(chapterId);
                    
                    NodeList vrsList = chaptRoot.getChildNodes();
                    int versesCount = vrsList.getLength();
                    for (int j = 0; j < versesCount; j++) {
                        if (vrsList.item(j).getNodeType() == Node.ELEMENT_NODE){
                            Element vrsRoot = (Element) vrsList.item(j);
                            String verseId = vrsRoot.getAttribute("id");                            
                            String text = vrsRoot.getAttribute(LANG);      
                            TreeMap<Integer,Character> hash = fillHash(vrsRoot.getChildNodes());
                            Verse verse = new Verse(verseId, text, hash);
                            //Verse verse = new Verse(verseId, text, new TreeMap());
                            сhapter.add(verse);
                        }
                    }
                    content.add(сhapter);
                }
            }
        }
        return content;
    };
    
    /**
     * Стих имеет собственный хэш.
     * @param list векта xml-документа
     * @return 
     */
    private TreeMap<Integer,Character> fillHash(NodeList list){
        TreeMap<Integer,Character> verseHash = new TreeMap();
        
        int nodeSize = list.getLength();        
        for (int j = 0; j < nodeSize; j++){ 
            String nodeName = list.item(j).getNodeName();
            if(nodeName.equals("hash")){    
                        
                int hashId;
                char chValue;
                
                Element hashRoot = (Element) list.item(j);
                if (hashRoot.getNodeType() == Node.ELEMENT_NODE){
                    hashId = Integer.parseInt(hashRoot.getAttribute("id"));
                    
                    //строка с 16-ным числом (без "0x")
                    String hexRadix = hashRoot.getAttribute(LANG).substring(2);                    
                    //hex2dec
                    int chIntVal = Integer.parseInt(hexRadix, 16);                    
                    //получаем юникод из числа
                    chValue = (char) chIntVal;
                    
                    //сохраняем
                    verseHash.put(hashId,chValue);
                }            
                
            }
            
        }
            
        return verseHash;
    }
    
}
